package com.ruoyi.pay.controller;

import com.github.wxpay.sdk.WXPayUtil;

import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.pay.config.IdWorker;
import com.ruoyi.pay.result.Result;
import com.ruoyi.pay.service.WXPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 1. 下订单后 30分钟要支付，没有支付关闭
 * 2、支持 微信、支付宝支付
 * 3、支付完成后加积分， 改变订单状态，改变订单支付方式（RabbitMQ）
 *
 */
@RestController
@RequestMapping("pay")
public class WXPayController {

    @Autowired
    IdWorker idWorker;


    @Autowired
    WXPayService wxPayService;

    @PostMapping("genWorkerId")
    public AjaxResult genW() throws Exception {
        return new AjaxResult(200,"OK",String.valueOf(idWorker.nextId()));
    }

    /**
     * 封装 微信支付的统一下单接口
     * URL地址：https://api.mch.weixin.qq.com/pay/unifiedorder
     * @param orderId
     * @param totalFee
     * @param body
     * @return
     * @throws Exception
     */
    @PostMapping("unifiedOrder/{orderId}/{totalFee}/{body}")
    public AjaxResult unir(@PathVariable Long orderId,
                               @PathVariable Integer totalFee,
                               @PathVariable String body) throws Exception {
        return  wxPayService.unifiedOrder(orderId, totalFee, body);

    }

    /**
     * 封装 微信支付的订单查询
     * URL地址：https://api.mch.weixin.qq.com/pay/orderquery
     * @param orderId
     * @return
     * @throws Exception
     */


    /**
     * 支付完成后，微信会把相关支付结果及用户信息通过数据流的形式发送给商户，商户需要接收处理，并按文档规范返回应答。
     *
     * 注意：
     * 1、同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
     *
     * 2、后台通知交互时，如果微信收到商户的应答不符合规范或超时，微信会判定本次通知失败，重新发送通知，
     * 直到成功为止（在通知一直不成功的情况下，微信总共会发起多次通知，
     * 通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m）
     * 这里通知发送可能会多台服务器进行发送，且发送时间可能会在几秒内，但微信不保证通知最终一定能成功。
     * 3、在订单状态不明或者没有收到微信支付结果通知的情况下，建议商户主动调用微信支付【查询订单API】确认订单状态。
     */
    @Autowired
    HttpServletRequest request;
    @Autowired
    HttpServletResponse response;
    @PostMapping("n")
    public void notify() throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        System.out.println("wx notify:"+simpleDateFormat.format(new Date()));
        String header = request.getHeader("Content-Type");
        System.out.println(header);

        BufferedReader reader = request.getReader();

        StringBuilder strin = new StringBuilder();
        reader.lines().forEach((line)->{
            stringBuilder.append(line);
        });
        String requestBodyXML = stringBuilder.toString();
        System.out.println(requeL);

        Map<String, String> requestBodyMap = WXPayUtil.xmlToMap(requestBodyXML);
        String return_code = requestBodyMap.get("return_code");
        if(return_code.equalsIgnoreCase("SUCCESS")){
            String result_code = requestBodyMap.get("result_code");
            String out_trade_no = requestBodyMap.get("out_trade_no");
            String total_fee = requestBodyMap.get("total_fee");

            System.out.println("out_trade_no=" + out_trade_no);
            System.out.println("total_fee=" + total_fee);

            PrintWriter writer = response.getWriter();
           /* writer.write("<xml>\n" +
                    "  <return_code><![CDATA[SUCCESS]]></return_code>\n" +
                    "  <return_msg><![CDATA[OK]]></return_msg>\n" +
                    "</xml>");*/

            Map responseMap = new HashMap();
            responseMap.put("return_code","SUCCESS");
            responseMap.put("return_msg","OK");
            String responseXML = WXPayUtil.mapToXml(responseMap);

            writer.write(responseXML);
        }
    }
}
